//#include <iostream>
//using namespace std;
//
//int main()
//{
//    int n;
//    cin >> n;
//    bool st = 0;
//    for (int i = 0; i <= n / 5; i++)
//    {
//        for (int j = 0; j <= n / 3; j++)
//        {
//            int z = n - i - j;
//            if (z >= 0 && z % 3 == 0 && 5 * i + 3 * j + (z / 3) == n)
//            {
//                cout << i << " " << j << " " << z << endl;
//                st = 1;
//            }
//        }
//    }
//    if (st == 0)
//    {
//        cout << "No Answer" << endl;
//    }
//    return 0;
//}
//
//
//#include <iostream>
//using namespace std;
//
//int main()
//{
//    double m, n;
//    cin >> m >> n;
//    double jige = m * 0.6;
//    double lh = m * 0.8;
//    int aaa = 0;
//    int bb = 0;
//    for (int i = 1; i <= n; i++)
//    {
//        double a;
//        cin >> a;
//        if (a >= lh)
//        {
//            aaa++;
//            bb++;
//        }
//        else if (a >= jige)
//        {
//            aaa++;
//        }
//    }
//    double c = aaa / n;
//    double d = bb / n;
//    if (c >= 0.75 && d >= 0.25)
//    {
//        cout << "Yes ";
//    }
//    else {
//        cout << "No ";
//    }
//    printf("%.1lf", c * 100);
//    cout << "% ";
//    printf("%.1lf", d * 100);
//    cout << "%";
//
//    return 0;
//}
//
//#include <iostream>
//using namespace std;
//
//
//int main()
//{
//    long long  a, b, c;
//    cin >> a >> b >> c;
//    long long ret = 0;
//    ret = (a + (a + (c - 1) * b)) * c / 2;
//    cout << ret << endl;
//    return 0;
//}
//
//
//#include <iostream>
//#include <set>
//using namespace std;
//
//int n;
//
//int main()
//{
//    cin >> n;
//    set<int> st;
//    for (int i = 1; i <= n; i++)
//    {
//        int x;
//        cin >> x;
//        st.insert(x);
//    }
//    cout << st.size() << endl;
//    bool t = 0;
//    for (auto ch : st)
//    {
//        if (t == 0)
//        {
//            cout << ch;
//            t = 1;
//        }
//        else
//            cout << " " << ch;
//    }
//    return 0;
//}
//
//
//
//
//#include <iostream>
//#include <map>
//using namespace std;
//
//int T, n;
//
//int main()
//{
//    cin >> T;
//    while (T--)
//    {
//        cin >> n;
//        map<int, int> mp;
//        for (int i = 1; i <= n; i++)
//        {
//            int x;
//            cin >> x;
//            mp[x]++;
//        }
//        int num = 0;
//        int cnt = 0;
//        for (auto ch : mp)
//        {
//            if (ch.second > cnt)
//            {
//                num = ch.first;
//                cnt = ch.second;
//            }
//        }
//        cout << num << " " << cnt << endl;
//    }
//    return 0;
//}
//
//
//
//#include <iostream>
//#include <string>
//#include <stack>
//using namespace std;
//
//int main()
//{
//    string s;
//    cin >> s;
//    int n = s.size();
//    s = " " + s;
//    int ret = 0;
//    int cnt = 0;
//    stack<char> q;
//    for (int i = 1; i <= n; i++)
//    {
//
//        if (s[i] == '(')
//        {
//            q.push(s[i]);
//        }
//        else
//        {
//            if (q.size() && q.top() == '(')
//            {
//                cnt += 2;
//                q.pop();
//            }
//            else {
//                q.push(s[i]);
//                ret = max(ret, cnt);
//                cnt = 0;
//            }
//        }
//    }
//
//    ret = max(ret, cnt);
//    cout << ret << endl;
//    return 0;
//}
//
//
//#include <iostream>
//#include <algorithm>
//#include <set>
//using namespace std;
//
//int n;
//
//int main()
//{
//    cin >> n;
//    set<int> st;
//    for (int i = 1; i <= n; i++)
//    {
//        int x;
//        cin >> x;
//        st.insert(x);
//    }
//    int ret = 0;
//    int x = 0;
//    for (auto ch : st)
//    {
//        //if(x == )
//        ret = x;
//        x = ch;
//    }
//    cout << ret << endl;
//    return 0;
//}
//
//
//
//#include <iostream>
//#include <algorithm>
//using namespace std;
//
//int n;
//string s[100000];
//
//bool cmp(string& a, string& b)
//{
//    string s1 = a + b;
//    string s2 = b + a;
//    return s1 >= s2;
//}
//
//int main()
//{
//    cin >> n;
//    for (int i = 1; i <= n; i++)
//    {
//        cin >> s[i];
//    }
//
//    sort(s + 1, s + 1 + n, cmp);
//    string ret;
//    for (int i = 1; i <= n; i++)
//    {
//        ret += s[i];
//    }
//    while (ret[0] == '0' && ret.size() > 1)
//        ret.erase(0, 1);
//
//    cout << ret << endl;
//    return 0;
//}


#include <iostream>
#include <cmath>
using namespace std;

int n;
int a[25] = { 0 };

int ret = 0x3f3f3f3f;
int cnt = 0;
void dfs(int x)
{

    if (x == 0)
    {
        ret = min(ret, cnt);
        return;
    }
    if (x < 0)
        return;

    for (int i = 10; i >= 1; i--)
    {
        if (x < a[i])
        {
            continue;
        }
        else
        {
            if (cnt >= ret)
                return;
            cnt++;
            dfs(x - a[i]);
            cnt--;
        }
    }

    return;
}

int main()
{
    cin >> n;

    for (int i = 1; i <= 20; i++)
    {
        a[i] = i * i;
    }
    dfs(n);

    cout << ret << endl;
    return 0;
}